package loja.services;

import java.math.BigDecimal;
import java.util.List;

import loja.dao.DAOFactory;
import loja.model.conta.ContaAbstrata;
import loja.model.conta.operacao.Operacao;
import loja.model.conta.titular.Titular;
import loja.model.conta.transacao.Transacao;

public class TransacaoService {

	private DAOFactory daoFactory;

	public TransacaoService(DAOFactory daoFactory) {
		this.daoFactory = daoFactory;
	}

	public void incluirCredito(Titular titular, String historico,
			BigDecimal valor) {
		ContaAbstrata conta = consultarContaPorTitular(titular);
		getTransacao(historico, valor, conta, null).efetuarTransacao();
	}

	public void incluirDebito(Titular titular, String historico,
			BigDecimal valor) {
		ContaAbstrata conta = consultarContaPorTitular(titular);
		getTransacao(historico, valor, null, conta).efetuarTransacao();
	}

	public void transferirValor(Titular titularDestino, Titular titularOrigem,
			String historico, BigDecimal valor) {

		ContaAbstrata contaDestino = consultarContaPorTitular(titularDestino);
		ContaAbstrata contaOrigem = consultarContaPorTitular(titularOrigem);
		Transacao transacao = getTransacao(historico, valor, contaDestino,
				contaOrigem);
		transacao.setTranferencia(true);
		transacao.efetuarTransacao();

	}

	public ContaAbstrata consultarContaPorTitular(Titular titular) {
		if (titular == null)
			return null;
		return this.daoFactory.getContaAbstrataDAO().consultarContaPorTitular(
				titular);
	}

	public List<Operacao> listarOperacoesConta(Titular titular) {
		return this.daoFactory
				.getOperacaoDAO(consultarContaPorTitular(titular))
				.listarOperacoes();

	}

	public BigDecimal getSaldoConta(Titular titular) {
		return this.daoFactory
				.getOperacaoDAO(consultarContaPorTitular(titular))
				.getSaldoConta();
	}

	private Transacao getTransacao(String historico, BigDecimal valor,
			ContaAbstrata contaDestino, ContaAbstrata contaOrigem) {

		Transacao transacao = new Transacao(daoFactory);
		transacao.setContaDestino(contaDestino);
		transacao.setContaOrigem(contaOrigem);
		transacao.setHistorico(historico);
		transacao.setValor(valor);
		return transacao;
	}

}
